<?php
namespace app\api\controller\mytool;
use think\Db;
use think\Controller;
use think\Loader;
use think\facade\Session;
use think\facade\Cache;
// use phpmailer\phpmailer;
use think\facade\Env;
use Qcloud\Sms\SmsSingleSender;
//cos 
use QCloud\COSSTS\Sts;
use QCloud\COSSTS\Scope;
//cos end
use PHPMailer\PHPMailer\PHPMailer; 
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use app\api\controller\Base;
class Mytool extends Base
{   
    public function cossts($allowPrefix){
      
      $sts = new Sts();
      $config = array(
          'url' => 'https://sts.tencentcloudapi.com/',
          'domain' => 'sts.tencentcloudapi.com',
          'proxy' => '',
          'secretId' => GROUP_SECRET_ID, // 固定密钥
          'secretKey' => GROUP_SECRET_KEY, // 固定密钥
          'bucket' => COSBUCKET, // 换成你的 bucket
          'region' => COSREGION, // 换成 bucket 所在园区
          'durationSeconds' => 1800, // 密钥有效期
          'allowPrefix' => $allowPrefix.'/*', // 这里改成允许的路径前缀，可以根据自己网站的用户登录态判断允许上传的具体路径，例子： a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
          // 密钥的权限列表。简单上传和分片需要以下的权限，其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
          'allowActions' => array (
              // 简单上传
              'name/cos:PutObject',
              'name/cos:PostObject',
              // 分片上传
              'name/cos:InitiateMultipartUpload',
              'name/cos:ListMultipartUploads',
              'name/cos:ListParts',
              'name/cos:UploadPart',
              'name/cos:CompleteMultipartUpload'
          )
      );
      // 获取临时密钥，计算签名
      $tempKeys = $sts->getTempKeys($config);
      return $tempKeys;
    }
  

    public static function sendsms($iphone = ""){
      //30分钟之内同一设备只可以获取5条短信
      if (empty($iphone)) {
        return ['code'=>'000','msg'=>'手机号输入出错，请重新尝试。'];
      }
      // header('Access-Control-Allow-Origin:*');  
      // header('Access-Control-Allow-Methods:*');  
      // header('Access-Control-Allow-Headers:x-requested-with,content-type');   
      // 短信应用SDK AppID
      $appid = SMSAPPID; // 1400开头
      // 短信应用SDK AppKey
      $appkey = SMSAPPKEY;
      // 需要发送短信的手机号码
      $phoneNumbers = [$iphone];
      // 短信模板ID，需要在短信应用中申请
      $templateId = 225473;  // NOTE: 这里的模板ID`7839`只是一个示例，真实的模板ID需要在短信控制台中申请
      // 签名
      $smsSign = SMSSIGN; // NOTE: 这里的签名只是示例，请使用真实的已申请的签名，签名参数使用的是`签名内容`，而不是`签名ID`
      //模板参数
      //  {1}为您的登录验证码，请于{2}分钟内填写。如非本人操作，请忽略本短信。
      $params = "【".$smsSign."】".self::getsmscode($iphone)."为您的登录验证码，请于3分钟内填写。如非本人操作，请忽略本短信。";
      // 单发短信
      try {
          $ssender = new SmsSingleSender($appid, $appkey);
          $result = $ssender->send(0, "86", $phoneNumbers[0],$params,"", "");
          $rsp = json_array($result,true);
      } catch(\Exception $e) {
        return myerr('短信发送失败，请重新尝试。');
      }
      if ( $rsp['result'] == 0) {
        return myok('短信发送成功，请注意查收。');
       }else{
        return myerr($rsp['errmsg']);
       }
    } 
    /**
     * 获取短信验证码
     * @param  [type] $iphone [description]
     * @return [type]         [description]
     */
    private static function getsmscode($iphone){
      $s_code = Cache::get("s_iphone_".$iphone,'');
      $r = rand(100000, 999999);
      Cache::set("s_iphone_".$iphone,$r,CODEMAXTIME);
      return $r;
    }

    

  
    public function MaterialTongzhi($totitle='',$tobody='通知暂无内容'){
      $totitle='素材审核通知'.$totitle;
      self::Myemail('490364291@qq.com',$totitle,$tobody);
    }
    public function Tongzhi($totitle='系统通知',$tobody='通知暂无内容'){
      self::Myemail('490364291@qq.com',$totitle,$tobody);
    }
    //发送邮箱验证码
    public function Myemail($toemail = '490364291@qq.com',$totitle='邮件标题',$tobody='邮件内容')
    {
      // return '1231';
       //$toemail = '490364291@qq.com';//收件人的邮箱

       $mail = new PHPMailer();
       $mail->isSMTP();// 使用SMTP服务
       $mail->CharSet = "utf8";// 编码格式为utf8，不设置编码的话，中文会出现乱码
       $mail->Host = "smtp.qq.com";// 发送方的SMTP服务器地址
       $mail->SMTPAuth = true;// 是否使用身份验证
       $mail->Username = "3020377892@qq.com";// 发送方的163邮箱用户名
       $mail->Password = "pdoqmqkqfzludcef";// 客户端授权密码
       $mail->SMTPSecure = "ssl";// 使用ssl协议方式
       $mail->Port = 465;// 163邮箱的ssl协议方式端口号是465/994

       $mail->setFrom("admin@tiyanclub.com","体验家会员系统");// 设置发件人信息
       $mail->addAddress($toemail,'收件');// 设置收件人信息
       $mail->addReplyTo("490364291@qq.com","回复");// 设置回复人信息
       //$mail->addCC("xxx@163.com");// 设置邮件抄送人，可以只写地址，上述的设置也可以只写地址(这个人也能收到邮件)
       //$mail->addBCC("xxx@163.com");// 设置秘密抄送人(这个人也能收到邮件)
       //$mail->addAttachment("bug0.jpg");// 添加附件


       $mail->Subject = $totitle;// 邮件标题
       $mail->Body = $tobody;// 邮件正文
       $mail->AltBody = "请登录web版邮箱查看具体内容。";// 这个是设置纯文本方式显示的正文内容，如果不支持Html方式，就会用到这个，基本无用

       if(!$mail->send()){// 发送邮件
          // echo "邮件发送失败<br><br>";
           return "邮件错误: ".$mail->ErrorInfo;// 输出错误信息
       }else{
           return '发送成功';
       }
    }

    //  public function MyQRcode()
    // {
    //     $ff= self::f("http://join.tiyanclub.com");

    //     $view = new view();
    //     $view->assign('datac',$ff);
    //     return $view->fetch();

    // }

     public static function MyQRcode($url = "http://www.baidu.com")
    {
        $qrcode = new QRcode();

        // $qrimage = new \QRimage();

        $value = $url;                    //二维码内容  
        $errorCorrectionLevel = 'H';    //容错级别  
        $matrixPointSize = 6;           //生成图片大小  

        ob_start();
        $qrcode::png($value,false , $errorCorrectionLevel, $matrixPointSize, 2);  
        // $object->png($url, false, $errorCorrectionLevel, $matrixPointSize, 2); //这里就是把生成的图片流从缓冲区保存到内存对象上，使用base64_encode变成编码字符串，通过json返回给页面。
        $imageString = base64_encode(ob_get_contents()); //关闭缓冲区
        ob_end_clean(); //把生成的base64字符串返回给前端 
        return $imageString;

    }
    /**
     * 导出excel表格
     * @param  string $name [表格名称]
     * @param  [type] $data [表格内容]
     * @param  [type] $head [表格标题行]
     * @param  [type] $keys [数据中对应的字段，用于读取相应数据：]
     * @return [type]       [下载表格]
     */
    public static function exceloutdata($name='测试表', $data=[], $head=[], $keys=[])
    {
        $count = count($head);  //计算表头数量
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        for ($i = 65; $i < $count + 65; $i++) {     //数字转字母从65开始，循环设置表头：
            $sheet->setCellValue(strtoupper(chr($i)) . '1', $head[$i - 65]);
        }
        /*--------------开始从数据库提取信息插入Excel表中------------------*/
        foreach ($data as $key => $item) {             //循环设置单元格：
            //$key+2,因为第一行是表头，所以写到表格时   从第二行开始写
            for ($i = 65; $i < $count + 65; $i++) {     //数字转字母从65开始：
               // $sheet->setCellValue(strtoupper(chr($i)) . ($key + 2), $item[$keys[$i - 65]]);
                $str = preg_replace('/\"/', '"', $item[$keys[$i - 65]]);
                $sheet->getCell(chr($i).($key+2))->setValue($str);
                $spreadsheet->getActiveSheet()->getColumnDimension(strtoupper(chr($i)))->setWidth(20); //固定列宽
                $spreadsheet->getActiveSheet()->getStyle(chr($i).($key+2))->getAlignment()->setWrapText(true);
            }
 
        }
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $name . '.xlsx"');
        header('Cache-Control: max-age=0');
        $writer = new Xlsx($spreadsheet);
        $writer->save('php://output');
        //删除清空：
        $spreadsheet->disconnectWorksheets();
        unset($spreadsheet);
        exit;
    }

    /**
     * 使用PHPEXECL导入
     *
     * @param string $file      文件地址
     * @param int    $sheet     工作表sheet(传0则获取第一个sheet)
     * @param int    $columnCnt 列数(传0则自动获取最大列)
     * @param array  $options   操作选项
     *                          array mergeCells 合并单元格数组
     *                          array formula    公式数组
     *                          array format     单元格格式数组
     *
     * @return array
     * @throws Exception
     */
   public static function ExcelInData(string $file = '', int $sheet = 0, int $columnCnt = 0, &$options = [])
    {
        try {
            /* 转码 */
            $file = iconv("utf-8", "gb2312", $file);
            if (empty($file) OR !file_exists($file)) {
                throw new \Exception('文件不存在!');
            }
            /** @var Xlsx $objRead */
            $objRead = IOFactory::createReader('Xlsx');

            if (!$objRead->canRead($file)) {
                /** @var Xls $objRead */
                $objRead = IOFactory::createReader('Xls');

                if (!$objRead->canRead($file)) {
                    throw new \Exception('只支持导入Excel文件！');
                }
            }
            /* 如果不需要获取特殊操作，则只读内容，可以大幅度提升读取Excel效率 */
            empty($options) && $objRead->setReadDataOnly(true);
            /* 建立excel对象 */
            $obj = $objRead->load($file);
            /* 获取指定的sheet表 */
            $currSheet = $obj->getSheet($sheet);

            if (isset($options['mergeCells'])) {
                /* 读取合并行列 */
                $options['mergeCells'] = $currSheet->getMergeCells();
            }
            if (0 == $columnCnt) {
                /* 取得最大的列号 */
                $columnH = $currSheet->getHighestColumn();
                /* 兼容原逻辑，循环时使用的是小于等于 */
                $columnCnt = Coordinate::columnIndexFromString($columnH);
            }
            /* 获取总行数 */
            $rowCnt = $currSheet->getHighestRow();
            $data   = [];
            /* 读取内容 */
            for ($_row = 1; $_row <= $rowCnt; $_row++) {
                $isNull = true;
                for ($_column = 1; $_column <= $columnCnt; $_column++) {
                    $cellName = Coordinate::stringFromColumnIndex($_column);
                    $cellId   = $cellName . $_row;
                    $cell     = $currSheet->getCell($cellId);
                    if (isset($options['format'])) {
                        /* 获取格式 */
                        $format = $cell->getStyle()->getNumberFormat()->getFormatCode();
                        /* 记录格式 */
                        $options['format'][$_row][$cellName] = $format;
                    }
                    if (isset($options['formula'])) {
                        /* 获取公式，公式均为=号开头数据 */
                        $formula = $currSheet->getCell($cellId)->getValue();
                        if (0 === strpos($formula, '=')) {
                            $options['formula'][$cellName . $_row] = $formula;
                        }
                    }
                    if (isset($format) && 'm/d/yyyy' == $format) {
                        /* 日期格式翻转处理 */
                        $cell->getStyle()->getNumberFormat()->setFormatCode('yyyy/mm/dd');
                    }
                    $data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue());
                    if (!empty($data[$_row][$cellName])) {
                        $isNull = false;
                    }
                }
                /* 判断是否整行数据为空，是的话删除该行数据 */
                if ($isNull) {
                    unset($data[$_row]);
                }
            }
          $Product = new Product();
          return $Product->productpushin($data);
        } catch (\Exception $e) {
            throw $e;
        }
    }
   
    /**
     * 图片上传
     * @return [type] [description]
     */
    public function upload()  
    {  
       $file = request()->file('file');
    // 移动到框架应用根目录/public/uploads/ 目录下
        if(!is_null($file)){
            //dump($file);
            $save_path = ROOT_PATH . 'public' . DS.'static' . DS . 'uploads'; 
            $info = $file->validate(["size"=>50000000,'ext'=>'jpg,png,gif'])->rule("date")->move($save_path);
            //echo $save_path. DS . date("Ymd") . DS .  $info->getFilename();
            $image = \think\Image::open($save_path . DS . $info->getSaveName());  
            $image->thumb(2000, 2000)->save($save_path .  DS . $info->getSaveName());  
            if($info){//getSaveName();
                $p=$info->getFilename();
            }else{
                // 上传失败获取错误信息
                $p=0;
            }
         } 
        else
            $p=0;
        return ($p);
    }  
 
     /**
     * 保存网络图片
     * @param  [type] $imgUrl [图片地址]
     * @return [type]         [description]
     */
    public function saveImg($imgUrl,$p=''){
      if ($p==IMGPASSWORD) {
        $baseName=time().rand(10,99).'.jpg';
        $saveUrl="static/head/wxhead/".$baseName;
        //文件保存绝对路径
        $path= Env::get('root_path').'public\\static' .'\\head'.'\\wxhead\\'.$baseName;
        $img = self::curl_file_get_contents($imgUrl);
        file_put_contents($path, $img);
        return $saveUrl; 
      }
    }
      /**
       * 获取图片，使用此方法速度会更快
       * @param  [type] $durl [description]
       * @return [type]       [图片流]
       */
      private function curl_file_get_contents($durl){
       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $durl);
       curl_setopt($ch, CURLOPT_TIMEOUT, 2);
       curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
       curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
       $r = curl_exec($ch);
       curl_close($ch);
       return $r;
     }
    
    /**
     * 字符串、数组转换为格式化的数组
     * @param string|array $data      原始字符串，可以为数组、 json字符串、 序列化字符串
     * @param string       $delimiter 字符串分隔符，默认为英文逗号
     * @return array
     */
   public static function strtoarray($data, string $delimiter = ','): array
    {

        // 数组原样返回
        if (is_array($data)) {
            return $data;
        }
        // 字符串处理
        $string = (string)$data;
        if (empty($string)) {
            $result = [];
        } else if (preg_match('/^{.*?}$/', $string) || preg_match('/^\[.*?]$/', $string)) {
            $result = json_array($string, true);
        } else if (preg_match('/^a:.*?(})$/', $string)) {
            $result = unserialize($string, null);
        } else if (strpos($string, $delimiter) >= 1) {
            $result = explode($delimiter, $string);
        } else {
            $result = [];
        }

        if (!is_array($result) || count($result) < 1) {
            return [];
        }
        return $result;
    }  
  /**
 * 人民币金额转大写
 * @param int $rmb  人民币金额
 * @param int $maxLength    显示长度
 * @return string
 */
  public static function convertRmbToUpper($rmb = 0,$maxLength = 0){
        //大写符号
        $upperSymbol = array(
            '0' => '零',
            '1' => '壹',
            '2' => '贰',
            '3' => '叁',
            '4' => '肆',
            '5' => '伍',
            '6' => '陆',
            '7' => '柒',
            '8' => '捌',
            '9' => '玖'
        );
        //单位符号
        $unitSymbol = array(
            '-2' => '分',
            '-1' => '角',
            '0' => '整',
            '1' => '元',
            '2' => '拾',
            '3' => '佰',
            '4' => '仟',
            '5' => '万',
            '6' => '拾',
            '7' => '佰',
            '8' => '仟',
            '9' => '亿',
        );

        $upperRmb = '';

        if(empty($maxLength)){
            $maxLength = 0;
        }

        $rmbSplit = explode('.',$rmb);

        //整数部分
        $length = strlen($rmbSplit[0]);
        if($length > $maxLength){
            $maxLength = $length;
        }
        for($i=0;$i<$maxLength;$i++){
            if($i < $length){
                $char = substr($rmbSplit[0],$i,1);
                $unitChar = $unitSymbol[$length-$i];
                $upperRmb .= $upperSymbol[$char].$unitChar;
            }else{
                $upperRmb = $unitSymbol[$i+1] . $upperRmb;
            }
        }

        //小数部分
        if(!isset($rmbSplit[1])){
            //如果没有小部分，默认填充2位小数
            $rmbSplit[1] = '00';
        }
        $length = strlen($rmbSplit[1]);
        for($i=0;$i<$length;$i++){
            $char = substr($rmbSplit[1],$i,1);
            $unitChar = $unitSymbol[-($i+1)];
            $upperRmb .= $upperSymbol[$char].$unitChar;
        }

        return $upperRmb;
    }
     /**
     * 获取语义化的时间
     * @param  [type] $value [description]
     * @return [type]        [description]
     */
    public static function getpeopletime($value){
        if (empty($value)) {
            return '暂无时间';
        }
        $day  = substr($value, 0,10);
        $time = substr($value, 11,5);
        $timenumber    = strtotime($day) - time();
        switch (floor($timenumber / 86400)+1) {
            case -3:
                $day = '3天前';
                break;
            case -2:
                $day = '2天前';
                break;
            case -1:
                $day = '1天前';
                break;
            case 0:
                $day = '今天';
                break;
            case 1:
                $day = '明天';
                break;
            case 2:
                $day = '后天';
                break;
            case 3:
                $day = '3天后';
                break;
            case 4:
                $day = '4天后';
                break;
            default:
                 $day = date('d日',strtotime($day));
                break;
        }
        return  $day.$time;
    } 
}
